package rfBio;
import java.util.HashSet;
import java.util.Set;

public class Bioutil {

	private static final Set aminoacids = new HashSet();
	private static final Set DNA = new HashSet();
	private static final Set RNA = new HashSet();


	
	//***********************
	// private methods
	//***********************

	//constructor
	
	public Bioutil(){
		init_aa();
		init_DNA();
		init_RNA();
	}
	
	private void init_aa(){
		aminoacids.add("A");
		aminoacids.add("R");
		aminoacids.add("N");
		aminoacids.add("D");
		aminoacids.add("C");
		aminoacids.add("Q");
		aminoacids.add("E");
		aminoacids.add("G");
		aminoacids.add("H");
		aminoacids.add("I");
		aminoacids.add("L");
		aminoacids.add("K");
		aminoacids.add("M");
		aminoacids.add("F");
		aminoacids.add("P");
		aminoacids.add("S");
		aminoacids.add("T");
		aminoacids.add("W");
		aminoacids.add("Y");
		aminoacids.add("V");
		aminoacids.add("X");
		aminoacids.add(".");
		aminoacids.add("a");
		aminoacids.add("r");
		aminoacids.add("n");
		aminoacids.add("d");
		aminoacids.add("c");
		aminoacids.add("q");
		aminoacids.add("e");
		aminoacids.add("g");
		aminoacids.add("h");
		aminoacids.add("i");
		aminoacids.add("l");
		aminoacids.add("k");
		aminoacids.add("m");
		aminoacids.add("f");
		aminoacids.add("p");
		aminoacids.add("s");
		aminoacids.add("t");
		aminoacids.add("w");
		aminoacids.add("y");
		aminoacids.add("v");
		aminoacids.add("x");
	}
	
	private void init_DNA(){
		DNA.add("A");
		DNA.add("T");
		DNA.add("G");
		DNA.add("C");
		DNA.add("N");
		DNA.add("a");
		DNA.add("t");
		DNA.add("g");
		DNA.add("c");
		DNA.add("n");
	}
	
	private void init_RNA(){
		RNA.add("A");
		RNA.add("U");
		RNA.add("G");
		RNA.add("C");
		RNA.add("N");
		RNA.add("a");
		RNA.add("u");
		RNA.add("g");
		RNA.add("c");
		RNA.add("n");
	}
	
	public static boolean isAminoAcid(String s){
		if(aminoacids.contains(s)){
			return true;
		}
		else
		{
			return false;
		}
	}
	
	public static boolean isDNA(String s){
		if(DNA.contains(s)){
			return true;
		}
		else
		{
			return false;
		}
	}
	
	public static boolean isRNA(String s){
		if(RNA.contains(s)){
			return true;
		}
		else
		{
			return false;
		}
	}
	
	public static String DNAcodonToAA(String codon){

		//Met
		if(codon.equals("atg")){
			return "m";
		}
		if(codon.equals("ATG")){
			return "M";
		}
		
		//Ala
		if(codon.equals("gca") || codon.equals("gcc") || codon.equals("gcg") || codon.equals("gct") ){
			return "a";
		}
		if(codon.equals("GCA") || codon.equals("GCC") || codon.equals("GCG") || codon.equals("GCT") ){
			return "A";
		}
		
		//Cys
		if(codon.equals("tgc") || codon.equals("tgt") ){
			return "c";
		}
		if(codon.equals("TGC") || codon.equals("TGT") ){
			return "C";
		}
		
		//Asp
		if(codon.equals("gac") || codon.equals("gat") ){
			return "d";
		}
		if(codon.equals("GAC") || codon.equals("GAT") ){
			return "D";
		}
		
		//Glu
		if(codon.equals("gaa") || codon.equals("gag") ){
			return "e";
		}
		if(codon.equals("GAA") || codon.equals("GAG") ){
			return "E";
		}
		
		//Phe
		if(codon.equals("ttc") || codon.equals("ttt") ){
			return "f";
		}
		if(codon.equals("TTC") || codon.equals("TTT") ){
			return "F";
		}
		
		//Gly
		if(codon.equals("gga") || codon.equals("ggc") || codon.equals("ggg") || codon.equals("ggt") ){
			return "g";
		}
		if(codon.equals("GGA") || codon.equals("GGC") || codon.equals("GGG") || codon.equals("GGT") ){
			return "G";
		}
		
		//His
		if(codon.equals("cac") || codon.equals("cat") ){
			return "h";
		}
		if(codon.equals("CAC") || codon.equals("CAT") ){
			return "H";
		}
		
		//Ile
		if(codon.equals("ata") || codon.equals("atc") || codon.equals("att") ){
			return "i";
		}
		if(codon.equals("ATA") || codon.equals("ATC") || codon.equals("ATT") ){
			return "I";
		}
		
		//Lys
		if(codon.equals("aaa") || codon.equals("aag") ){
			return "k";
		}
		if(codon.equals("AAA") || codon.equals("AAG") ){
			return "K";
		}
		
		//Leu
		if(codon.equals("tta") || codon.equals("ttg") || codon.equals("cta") || codon.equals("ctc") || codon.equals("ctg") || codon.equals("ctt") ){
			return "l";
		}
		if(codon.equals("TTA") || codon.equals("TTG") || codon.equals("CTA") || codon.equals("CTC") || codon.equals("CTG") || codon.equals("CTT") ){
			return "L";
		}

		//Asn
		if(codon.equals("aac") || codon.equals("aat") ){
			return "n";
		}
		if(codon.equals("AAC") || codon.equals("AAT") ){
			return "N";
		}
		
		//Pro
		if(codon.equals("cca") || codon.equals("ccc") || codon.equals("ccg") || codon.equals("cct") ){
			return "p";
		}
		if(codon.equals("CCA") || codon.equals("CCC") || codon.equals("CCG") || codon.equals("CCT") ){
			return "P";
		}
		
		//Gln
		if(codon.equals("caa") || codon.equals("cag") ){
			return "q";
		}
		if(codon.equals("CAA") || codon.equals("CAG") ){
			return "Q";
		}
		
		//Arg
		if(codon.equals("cga") || codon.equals("cgc") || codon.equals("cgg") || codon.equals("cgt") || codon.equals("aga") || codon.equals("agg") ){
			return "r";
		}
		if(codon.equals("CGA") || codon.equals("CGC") || codon.equals("CGG") || codon.equals("CGT") || codon.equals("AGA") || codon.equals("AGG") ){
			return "R";
		}
		
		//Ser
		if(codon.equals("tca") || codon.equals("tcc") || codon.equals("tcg") || codon.equals("tct") || codon.equals("agc") || codon.equals("agt") ){
			return "s";
		}
		if(codon.equals("TCA") || codon.equals("TCC") || codon.equals("TCG") || codon.equals("TCT") || codon.equals("AGC") || codon.equals("AGT") ){
			return "S";
		}
		
		//Thr
		if(codon.equals("aca") || codon.equals("acc") || codon.equals("acg") || codon.equals("act") ){
			return "t";
		}
		if(codon.equals("ACA") || codon.equals("ACC") || codon.equals("ACG") || codon.equals("ACT") ){
			return "T";
		}
		
		//Val
		if(codon.equals("gta") || codon.equals("gtc") || codon.equals("gtg") || codon.equals("gtt") ){
			return "v";
		}
		if(codon.equals("GTA") || codon.equals("GTC") || codon.equals("GTG") || codon.equals("GTT") ){
			return "V";
		}
		
		//Trp
		if(codon.equals("tgg")){
			return "w";
		}
		if(codon.equals("TGG")){
			return "W";
		}
		
		//Tyr
		if(codon.equals("tac") || codon.equals("tat") ){
			return "y";
		}
		if(codon.equals("TAC") || codon.equals("TAT") ){
			return "Y";
		}
		
		//Stop
		if(codon.equals("taa") || codon.equals("tag") || codon.equals("tga") ){
			return ".";
		}
		if(codon.equals("TAA") || codon.equals("TAG") || codon.equals("TGA") ){
			return ".";
		}
			
		return"";
	}
	
public static String RNAcodonToAA(String codon){

		//Met
		if(codon.equals("aug")){
			return "m";
		}
		if(codon.equals("AUG")){
			return "M";
		}
		
		//Ala
		if(codon.equals("gca") || codon.equals("gcc") || codon.equals("gcg") || codon.equals("gcu") ){
			return "a";
		}
		if(codon.equals("GCA") || codon.equals("GCC") || codon.equals("GCG") || codon.equals("GCU") ){
			return "A";
		}
		
		//Cys
		if(codon.equals("ugc") || codon.equals("ugu") ){
			return "c";
		}
		if(codon.equals("UGC") || codon.equals("UGU") ){
			return "C";
		}
		
		//Asp
		if(codon.equals("gac") || codon.equals("gau") ){
			return "d";
		}
		if(codon.equals("GAC") || codon.equals("GAU") ){
			return "D";
		}
		
		//Glu
		if(codon.equals("gaa") || codon.equals("gag") ){
			return "e";
		}
		if(codon.equals("GAA") || codon.equals("GAG") ){
			return "E";
		}
		
		//Phe
		if(codon.equals("uuc") || codon.equals("uuu") ){
			return "f";
		}
		if(codon.equals("UUC") || codon.equals("UUU") ){
			return "F";
		}
		
		//Gly
		if(codon.equals("gga") || codon.equals("ggc") || codon.equals("ggg") || codon.equals("ggu") ){
			return "g";
		}
		if(codon.equals("GGA") || codon.equals("GGC") || codon.equals("GGG") || codon.equals("GGU") ){
			return "G";
		}
		
		//His
		if(codon.equals("cac") || codon.equals("cau") ){
			return "h";
		}
		if(codon.equals("CAC") || codon.equals("CAU") ){
			return "H";
		}
		
		//Ile
		if(codon.equals("aua") || codon.equals("auc") || codon.equals("auu") ){
			return "i";
		}
		if(codon.equals("AUA") || codon.equals("AUC") || codon.equals("AUU") ){
			return "I";
		}
		
		//Lys
		if(codon.equals("aaa") || codon.equals("aag") ){
			return "k";
		}
		if(codon.equals("AAA") || codon.equals("AAG") ){
			return "K";
		}
		
		//Leu
		if(codon.equals("uua") || codon.equals("uug") || codon.equals("cua") || codon.equals("cuc") || codon.equals("cug") || codon.equals("cuu") ){
			return "l";
		}
		if(codon.equals("UUA") || codon.equals("UUG") || codon.equals("CUA") || codon.equals("CUC") || codon.equals("CUG") || codon.equals("CUU") ){
			return "L";
		}

		//Asn
		if(codon.equals("aac") || codon.equals("aau") ){
			return "n";
		}
		if(codon.equals("AAC") || codon.equals("AAU") ){
			return "N";
		}
		
		//Pro
		if(codon.equals("cca") || codon.equals("ccc") || codon.equals("ccg") || codon.equals("ccu") ){
			return "p";
		}
		if(codon.equals("CCA") || codon.equals("CCC") || codon.equals("CCG") || codon.equals("CCU") ){
			return "P";
		}
		
		//Gln
		if(codon.equals("caa") || codon.equals("cag") ){
			return "q";
		}
		if(codon.equals("CAA") || codon.equals("CAG") ){
			return "Q";
		}
		
		//Arg
		if(codon.equals("cga") || codon.equals("cgc") || codon.equals("cgg") || codon.equals("cgu") || codon.equals("aga") || codon.equals("agg") ){
			return "r";
		}
		if(codon.equals("CGA") || codon.equals("CGC") || codon.equals("CGG") || codon.equals("CGU") || codon.equals("AGA") || codon.equals("AGG") ){
			return "R";
		}
		
		//Ser
		if(codon.equals("uca") || codon.equals("ucc") || codon.equals("ucg") || codon.equals("ucu") || codon.equals("agc") || codon.equals("agu") ){
			return "s";
		}
		if(codon.equals("UCA") || codon.equals("UCC") || codon.equals("UCG") || codon.equals("UCU") || codon.equals("AGC") || codon.equals("AGU") ){
			return "S";
		}
		
		//Thr
		if(codon.equals("aca") || codon.equals("acc") || codon.equals("acg") || codon.equals("acu") ){
			return "t";
		}
		if(codon.equals("ACA") || codon.equals("ACC") || codon.equals("ACG") || codon.equals("ACU") ){
			return "T";
		}
		
		//Val
		if(codon.equals("gua") || codon.equals("guc") || codon.equals("gug") || codon.equals("guu") ){
			return "v";
		}
		if(codon.equals("GUA") || codon.equals("GUC") || codon.equals("GUG") || codon.equals("GUU") ){
			return "V";
		}
		
		//Trp
		if(codon.equals("ugg")){
			return "w";
		}
		if(codon.equals("UGG")){
			return "W";
		}
		
		//Tyr
		if(codon.equals("uac") || codon.equals("uau") ){
			return "y";
		}
		if(codon.equals("UAC") || codon.equals("UAU") ){
			return "Y";
		}
		
		//Stop
		if(codon.equals("uaa") || codon.equals("uag") || codon.equals("uga") ){
			return ".";
		}
		if(codon.equals("UAA") || codon.equals("UAG") || codon.equals("UGA") ){
			return ".";
		}
			
		return"";
	}
}
